//////////////////////////////////serveur/////////////////////////////////////////////////////////////////
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/select.h>
#include <string>
#include "Siege.h"
#include "DaoClient.h"
#include "Client.h"
#include "Vehicule.h"
#include "DaoVehicule.h"
#include "Tourisme.h"
#include "Utilitaire.h"
#include "DaoAgence.h"
using namespace std;
void Saisir_Agence(){
	DaoAgence d;
	long id;
	string no,nomg,loc;
		cout<<"- iD AGENCE :"<<endl;
		cin>>id;
		if(d.existAgence(id)==0)
	    {
	    cout << "Agence n° "<<id<<" existe déjà"<<endl;
	    }
		else
		{
		cout<<"- Nom AGENCE :"<<endl;
		cin>>no;
		cout<<"- Nom Gestionnaire :"<<endl;
		cin>>nomg;
		cout<<"- Localisation :"<<endl;
	    cin>>loc;
	    Agence a(id,no,nomg,loc);
	    d.ajouterAgence(a);
		}
}
void Saisir_Vehicule()
{
	DaoVehicule d;
	int choice;
	cout<<"- Voiture Tapez : 1"<<endl;
	cout<<"- Tourisme Tapez : 2"<<endl;
	cout<<"- Utilitaire Tapez : 3"<<endl;
	cin>>choice;
	if(choice==1)
	{
		string mat, marq, coul;
		double prix;
		cout<<"- Matricule :"<<endl;
		cin>>mat;
		cout<<"- Marque :"<<endl;
		cin>>marq;
		cout<<"- Couleur :"<<endl;
		cin>>coul;
		cout<<"- Prix Par Jour :"<<endl;
		cin>>prix;
		Vehicule v(mat,marq,coul,prix);
		d.ajouterVehicule(v);
	}
	else if(choice==2)
		{
		string mat,couleur,marque;
			double prix;
			int nombrePortes,nombrePassagers,nombreBagages;
			cout<<"- Matricule :"<<endl;
			cin>>mat;
			cout<<"- Couleur :"<<endl;
			cin>>couleur;
			cout<<"- Marque :"<<endl;
			cin>>marque;
			cout<<"- Prix Par Jour :"<<endl;
			cin>>prix;
			cout<<"- Nombre DE Portes :"<<endl;
			cin>>nombrePortes;
			cout<<"- Nombre de Passagers :"<<endl;
            cin>>nombrePassagers;
            cout<<"- Nombre de Bagages :"<<endl;
            cin>>nombreBagages;
			Tourisme t(mat,couleur,marque,prix,nombrePortes,nombrePassagers,nombreBagages,true);
			d.ajouterVehicule(t);
		}
	else if(choice==3)
			{
			string mat,couleur,marque;
				double prix,chargeUtile;
				float longueur,largeur,hauteur;
				cout<<"- Matricule :"<<endl;
				cin>>mat;
				cout<<"- Couleur :"<<endl;
				cin>>couleur;
				cout<<"- Marque :"<<endl;
				cin>>marque;
				cout<<"- Prix Par Jour :"<<endl;
				cin>>prix;
				cout<<"- Charge Utile :"<<endl;
				cin>>chargeUtile;
				cout<<"- Longueur :"<<endl;
	            cin>>longueur;
	            cout<<"- Largeur :"<<endl;
	            cin>>largeur;
	            cout<<"- Hauteur :"<<endl;
	            cin>>hauteur;
				Utilitaire u(mat,couleur,marque,prix,chargeUtile,longueur,largeur,hauteur);
				d.ajouterVehicule(u);
			}
}
void Saisir_Client()
{
	long numClient;
    long numPermis;
    string nomClient;
    string prenomClient;
    string adresse;
    string ville;
    DaoClient C;
    long telephone;

    			cout << endl << "*** Nouveau Client ***" << endl << endl;
    			cout << "Numéro du Client: ";
    			cin >> numClient;
    			if( C.rechercherClient(numClient) ==0)
    			{
    				cout << "Client n° "<<numClient<<" existe déjà"<<endl;
    			}
    			else
    			{
    				cout << "Numéro Permis : ";
    				cin >> numPermis;
    				cout << "Nom Client : ";
    				cin >> nomClient;
    				cout << "Prénom Client: ";
    				cin >> prenomClient;
    				cout << "Adresse : ";
    				cin >> adresse;
    				cout << "Ville : ";
    				cin >> ville;
    				cout << "Téléphone : ";
    				cin >> telephone;
    				Client j(numClient,nomClient,prenomClient,numPermis,adresse,ville,telephone);
    				 C.ajouterClient(j);
    			}
    		}


int main ()
{
int tt;
cout<<"Gestion 0 Ou Connexion 1???"<<endl;
cin>>tt;
if(tt==1)
{
	cout<<"\n\n**************** Gestion Location Véhicules -- Partie Serveur ****************\n"<<endl;
	cout<<"**************** Attente de Clients****************\n"<<endl;
    int choixmenu;
    int deconnexion;
    int decoserv=0;//deconnextion serveure
    int perefils;
    int  nump;
    int socketprim;
    int socketsecond;
    int lg;//longueurstruct
    int erreur;
    typedef struct data {
   				char mat[20];
   				long agence;
   				long client;
   				int nb;
   				char date[20];
   			  } data;
   			  data informations;
    struct sockaddr_in adresse;



  socketprim=socket (AF_INET, SOCK_STREAM, 0);//creation du descripteur de socket
  if (socketprim == -1)
     {
	 perror("creation socket sur le serveur");
     }
     else
       {
	lg=sizeof(struct sockaddr_in);

       adresse.sin_family=AF_INET;                    //initialisation de l'adresse : le domaine
	 adresse.sin_port=9778;				// initialisation de l'adresse : le port
	 adresse.sin_addr.s_addr=INADDR_ANY;		//initialisation de l'adresse : la machine (locale)
	 erreur=bind(socketprim, (struct sockaddr *) &adresse, lg);	// liaison

	 if (erreur == -1)
            {
		 perror("Erreur Connection bind mta3 el serveur");
	    }
            else
               {
		erreur=listen(socketprim,10);  		// creation de la file d'attente
	         if (erreur == -1)
                    {
			perror("creation de la file d'attente sur le serveur");
		    }
                    else
		       {
                        nump=getpid();
			printf ("\n numero processus fork%d\n",nump);
			while(decoserv==0) {  //boucle infini pour le serveur il accepte tout les client et les classe
			    socketsecond=accept(socketprim, (struct sockaddr *) &adresse, (socklen_t*) &lg); // attente du client
			       if (erreur == -1)

				   perror("accept par le serveur");

				   perefils = fork ();


//On est dans le fils
      if (perefils == 0)
	{
          deconnexion = 0;
	  while (deconnexion == 0)
	    {
                erreur = read (socketsecond, &choixmenu, sizeof (choixmenu));
		if(erreur==-1)
		     perror("lecture dans la soketsecond");
		if((choixmenu==1)||(choixmenu==2)||(choixmenu==3)||(choixmenu==4))
		     cout<<"\nLe Choix Menu Éfféctuer par le Client est ====> \n"<<choixmenu;
		else
                    {
		    cout<<"\nVotre instruction proposé ne figure pas dans le menu !!\n";
		    }
//Gestion du choix du client
	      switch (choixmenu)
		{

		case 1:
		  {
		     cout<<"\nAttente des informations transmises par le client!!\n";
		     erreur=read (socketsecond, &informations, sizeof (informations));//reception
		    if(erreur==-1)
		     perror("lecture dans la soketsecond");
		     if(erreur!=-1)
		     {
		    	 cout<<informations.nb<<endl;
		    	 cout<<informations.mat<<endl;
		    	 cout<<informations.agence<<endl;
		    	 cout<<informations.client<<endl;
		    	 cout<<informations.nb<<endl;
		     cout<<informations.date<<endl;
		   Siege S;
		  int loue;
		  loue= S.louer(informations.mat,informations.agence,informations.client,informations.nb,informations.date);
		   erreur=write (socketsecond, &loue, sizeof (loue));
		     }
		    }
		    break;
		case 2:
			 { erreur=read (socketsecond, &informations, sizeof (informations));//reception
					    if(erreur==-1)
					     perror("lecture dans la soketsecond");
					     if(erreur!=-1)
					     {
					    	 cout<<informations.mat<<endl;
					    	 Siege K;
					    	 K.supprimerLocation(informations.mat);
					     }
			 }
			 break;
		case 3:
		  {
		    printf ("\nDemande de Déconnexion!!\n");
		    deconnexion = 1;
		    break;
		  }
		default:
		  {
		    printf ("\nSaisissez une instruction svp!!\n");
		    break;
		  }

	     }//fin switch (choixmenu)
                if (deconnexion==1)
		  {
		    printf ("\nDemande de Deconnexion Acceptée BYE!!\n");
	            erreur = close (socketsecond);
		    if (erreur!=-1)
	            printf("\nSocket client fermÉE avec succès!!\n");
		    else
		     printf("\nFermeture du socKet client impossible!!\n");
		  }

          }// fin de la boucle while (deconnexion == 0)
        }//fermeture du if(perefils == 0)
      }//fin de la boucle infini pour le serveur (il accepte tout les client et les classe)
     }//fermeture else comencement du traitement
   }// fermeture else creation de la file d'attente
}// fermeture else creation du descripteur de socket
}
else{
  int option;
  	    do{
            cout<<"      �������������������������� MENU ����������������������������"<<endl;
    		cout<<"      �   -----------------------------------------------------  �"<<endl;
    		cout<<"      �  (  | 1 | Ajouter Client                               ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 2 | Ajouter Véhicule                             ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 3 | Ajouter Agence                               ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 4 | Afficher les Clients                         ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 5 | Afficher les Véhicules                       ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 6 | Afficher les Agences                         ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 7 | Consulter Véhicule                           ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 8 | Louer Véhicule                               ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 9 | Rentree Véhicule                             ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 10| Supprimer Véhicule                           ) �"<<endl;
    		cout<<"      �                                                          �"<<endl;
    		cout<<"      �  (  | 0 | EXIT                                         ) �"<<endl;
    		cout<<"      �   -----------------------------------------------------  �"<<endl;
    		cout<<"      ����������������������������������������������������������ͼ"<<endl<<endl;

  		cout<<"      ****************   Entrez Votre Choix   *************** *\t"<<endl;

  		cin>>option;
      if(option == 1)
      {
      Saisir_Client();
      }
      else if(option == 2)
      {
      Saisir_Vehicule();
      }
      else if(option == 3)
      {
      Saisir_Agence();
      cin>>option;
      }
      else if(option == 4)
      {
          DaoClient n;
          n.listClient();
      }
      else if(option == 5)
      {
          DaoVehicule x;
          x.listeVehicule();
      }
      else if(option == 6)
      {
             DaoAgence y;
             y.listeagence();
      }
      else if(option == 7)
         {
                DaoVehicule q;
                string cli;
                cout<<"Veuillez Saisir le matricule du Véhicule à consulter :"<<endl;
                cin>>cli;
               Vehicule v = q.rechercherVehicule(cli);
               v.afficher();
         }
      else if(option == 8)
           {
      			string voiture;
      			long client;
      			long agence=1000;
      			int nbjours;
      			string date;
                  cout<<"Matricule de Véhicule à louer :"<<endl;
                  cin>>voiture;
                  cout<<"Numéro du Client :"<<endl;
                  cin>>client;
                  cout<<"Nombre de Jours :"<<endl;
                  cin>>nbjours;
                  cout<<"Date au format(jj/mm/aaaa) :"<<endl;
                  cin>>date;
                  Siege z;
                  z.louer(voiture,agence,client,nbjours,date);

           }

           else if(option == 9)
           {
      			string voiture;
                  cout<<"Veuillez saisir le Matricule de Véhicule à rendre :"<<endl;
                  cin>>voiture;
                  Siege KK;
                  if(KK.rechercherLocation(voiture) == 0)
                	  cout<<"Véhicule n'est pas Loué\n";
                  else
                  KK.supprimerLocation(voiture);
           }
           else if(option== 10)
  			{ string matrii;
  			cout<<"Donner le matricule de Véhicule à Supprimer\n";
  			cin>>matrii;
  			DaoVehicule da;
  			da.supprimerVehicule(matrii);
  			}
		 else if(option== 0)
		  	{ 
		  	cout<<"Déconnection Serveur, Au revoir !!!!!!!!!!!!!!!!!!!!!!!\n";
		  	return 0;
		  	}

  	}while(option!=1 || option!=2 || option!= 3 || option!= 4 || option!= 5 || option!= 6 || option!= 7 || option!= 8 || option!= 9 || option!= 10 || option!= 0);
  	}
  return 0;
}//fin main
